package org.dtree.pv;

import com.reger.dubbo.rpc.filter.Utils;
import org.dtree.pv.sys.models.Sys_menu;
import org.dtree.pv.sys.models.Sys_role;
import org.dtree.pv.sys.models.Sys_user;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.util.Daos;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;

@SpringBootApplication
public class DtServiceSysApplication implements CommandLineRunner,DisposableBean {
	private  final Logger log = LoggerFactory.getLogger(DtServiceSysApplication.class);

	@Autowired
	Dao dao;

	private final static CountDownLatch latch = new CountDownLatch(1);
	private static ConfigurableApplicationContext context;

	public static void main(String[] args) throws Exception{


		Utils.register(Exception.class); // 注册允许传递的异常类型
		Utils.register(RuntimeException.class); // 注册允许传递的异常类型
		context = SpringApplication.run(DtServiceSysApplication.class, args);

			latch.await();
		try{
		}catch (Exception e){
			System.out.println(":::: latch.await() 方法抛出了一个异常, 如果不影响业务调用,不必理会");
		}

	}

	@Override
	public void destroy() throws Exception {
		latch.countDown();
		context.close();
		log.info("服务提供者关闭------>>服务关闭");
	}

	@Override
	public void run(String... args) throws Exception {
		log.info("服务提供者启动完毕------>>启动完毕");
		// 基础信息初始化

		init();

	}

	public void init(){

		//通过POJO类创建表结构
		try {
			Daos.createTablesInPackage(dao, "org.dtree.pv", false);
				//通过POJO类修改表结构
			Daos.migration(dao, "org.dtree.pv", true, false);
		} catch (Exception e) {
			//System.out.println("fuck  出异常了??????");

		}

		// 若必要的数据表不存在，则初始化数据库
		System.out.println("================================================================");
		if (0 == dao.count(Sys_user.class)) {
			// 初始化用户
			initSysUsers();
			// 初始化角色
			initSysRoles();
			// 初始化权限
			initSysMenus();

			// 初始化用户和角色的关系
			reUserRole();
			// 初始化角色和权限的关系
			reRoleMenu();
		}

	}

	/**
	 * 初始化用户和角色的关联关系
	 */
	private void reUserRole() {
		String userId = dao.fetch(Sys_user.class, Cnd.where("username", "=", "超级管理员")).getId();
		//List<String> roleNames = Arrays.asList("SUPERADMIN");
		String roleId = dao.fetch(Sys_role.class, Cnd.where("aliasName", "=", "SUPERADMIN")).getId();
		dao.insert("sys_user_role", Chain.make("userId",userId).add("roleId",roleId));
	}

	/**
	 * 初始化角色和菜单/权限的关联关系
	 */
	private void reRoleMenu() {
		// 初始化超级管理员的权限  只有用户管理
		initSuperAdminMenu();


	}

	/**
	 * 初始化超级管理员的权限
	 */
	private void initSuperAdminMenu() {
		String roleId = dao.fetch(Sys_role.class, Cnd.where("aliasName", "=", "SUPERADMIN")).getId();
		List<String> list = Arrays.asList("user","user.list");
		List<String> menuIds = getMenuIds(list);
		menuIds.forEach(menuId->{
			dao.insert("sys_role_menu",Chain.make("roleId",roleId).add("menuId",menuId));
		});



	}

	/**
	 * 通过权限列表获取权限ID
	 * @param permissions
	 * @return
	 */
	private List<String> getMenuIds(List<String> permissions) {
		List<String> results = new ArrayList<>();
		permissions.forEach(permission->{
			String permissionId = dao.fetch(Sys_menu.class, Cnd.where("permission", "=", permission)).getId();
			results.add(permissionId);
		});
		return results;
	}






	public void initSysUsers(){
		Sys_user user = new Sys_user();
		user.setLoginname("superadmin");
		user.setUsername("超级管理员");
		user.setSalt("r5tdr01s7uglfokpsdmtu15602");
		user.setPassword("1bba9287ebc50b766bff84273d11ccefaa7a8da95d078960f05f116e9d970fb0");
		user.setLoginIp("127.0.0.1");
		user.setLoginAt(0L);
		user.setLoginCount(0);
		user.setEmail("deng.wubo@smarttoo.cn");
		dao.insert(user);


	}

	/**
	 * 1. 超级管理员
	 * 2. 系统管理员
	 * 3. 项目经理
	 * 4. 专业负责人
	 * 5. 设计师
	 */
	public void initSysRoles(){
		Sys_role role = new Sys_role();

		role.setName("超级管理员");
		role.setAliasName("SUPERADMIN");
		role.setNote("超级管理员,只针对开发者调试系统使用");

		dao.insert(role);
		role = new Sys_role();

		role.setName("系统管理员");
		role.setAliasName("ADMIN");
		role.setNote("系统管理员,可以对操作后台管理系统的基础信息");

		dao.insert(role);
		role = new Sys_role();

		role.setName("项目经理");
		role.setAliasName("PROMANAGER");
		role.setNote("项目经理,拥有项目相关权限");

		dao.insert(role);
		role = new Sys_role();

		role.setName("专业负责人");
		role.setAliasName("SPEMANAGER");
		role.setNote("专业负责人,参与自己专业的审图和讨论");

		dao.insert(role);
		role = new Sys_role();

		role.setName("设计师");
		role.setAliasName("DESIGNER");
		role.setNote("设计师,上传图纸和参与讨论");

		dao.insert(role);



	}

	/**
	 * 初始化菜单和权限
	 */
	public void initSysMenus(){


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++ 基础信息 ++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++

		Sys_menu menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("0001");
		menu.setName("基础信息");
		menu.setAliasName("base");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId("");
		menu.setType("menu");
		menu.setPermission("base");
		Sys_menu m1 = dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010001");
		menu.setName("建筑类型");
		menu.setAliasName("buildingType");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.buildingType");
		dao.insert(menu);


		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010002");
		menu.setName("设计阶段");
		menu.setAliasName("designPhase");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.designPhase");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010003");
		menu.setName("专业分类");
		menu.setAliasName("special");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.special");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010004");
		menu.setName("设计系统");
		menu.setAliasName("system");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.system");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010005");
		menu.setName("构建分类");
		menu.setAliasName("component");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.component");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010006");
		menu.setName("空间分类");
		menu.setAliasName("space");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.space");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010007");
		menu.setName("问题类型");
		menu.setAliasName("problemType");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.problemType");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010008");
		menu.setName("问题影响");
		menu.setAliasName("problem");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.problem");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010009");
		menu.setName("企业题库");
		menu.setAliasName("companyIssue");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.companyIssue");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010010");
		menu.setName("区域列表");
		menu.setAliasName("area");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.area");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00010011");
		menu.setName("图纸标签");
		menu.setAliasName("drawingLabel");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m1.getId());
		menu.setType("menu");
		menu.setPermission("base.drawingLabel");
		dao.insert(menu);




//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++ 题目管理 ++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("0002");
		menu.setName("题目管理");
		menu.setAliasName("question");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId("");
		menu.setType("menu");
		menu.setPermission("question");
		Sys_menu m2 = dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00020001");
		menu.setName("题目列表");
		menu.setAliasName("list");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m2.getId());
		menu.setType("menu");
		menu.setPermission("question.list");
		dao.insert(menu);


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++ 用户管理 ++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("0003");
		menu.setName("用户管理");
		menu.setAliasName("user");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId("");
		menu.setType("menu");
		menu.setPermission("user");
		Sys_menu m3 = dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00030001");
		menu.setName("用户列表");
		menu.setAliasName("list");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m3.getId());
		menu.setType("menu");
		menu.setPermission("user.list");
		dao.insert(menu);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++ 项目管理 ++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("0004");
		menu.setName("项目管理");
		menu.setAliasName("project");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId("");
		menu.setType("menu");
		menu.setPermission("project");
		Sys_menu m4 = dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00040001");
		menu.setName("项目列表");
		menu.setAliasName("list");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m4.getId());
		menu.setType("menu");
		menu.setPermission("project.list");
		dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00040002");
		menu.setName("项目题库");
		menu.setAliasName("questions");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m4.getId());
		menu.setType("menu");
		menu.setPermission("project.questions");
		dao.insert(menu);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++ 企业管理 ++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("0005");
		menu.setName("企业管理");
		menu.setAliasName("company");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId("");
		menu.setType("menu");
		menu.setPermission("company");
		Sys_menu m5 = dao.insert(menu);

		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00050001");
		menu.setName("企业列表");
		menu.setAliasName("list");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m5.getId());
		menu.setType("menu");
		menu.setPermission("company.list");
		dao.insert(menu);


		menu = new Sys_menu();
		menu.setDisabled(false);
		menu.setPath("00050002");
		menu.setName("客户类型");
		menu.setAliasName("custom");
		menu.setIsShow(true);
		menu.setHasChildren(true);
		menu.setParentId(m5.getId());
		menu.setType("menu");
		menu.setPermission("company.custom");
		dao.insert(menu);




	}


}
